Флаги.
O D I T S Z A P C * * * * * *
Команда:
CMPSB
Логика
CMP (DS:SI), (ES:DI) ; только устанавливает
признаки
if DF = 0
SI = SI + 1
DI = DI + 1
else
SI = SI - 1
DI = DI - 1
Эта команда сравнивает два значения, вычитая байт, на который указывает ES:DI, из байта, на который указывает DS:SI, и устанавливает флаг в соответствии с результатами сравнения. Сами операнды не изменяются. После сравнения, SI и DI увеличиваются на 1, если флаг направления сброшен, или уменьшаются на 1, если флаг направления установлен. Тем самым подготавливаются к сравнению следующие элементы обеих строк.
| Операнды | Такт байты (слова) | Обращения | Байты | Пример |
| нет операндов | 22 | 2 | 1 | CMPSB |
| (повтор) | 9+22/rep | 2/rep | 1 | REPE CMPSB |
Пусть имеют место следующие определения :
buffer1 db 100 dup (?) buffer2 db 100 dup (?)
Тогда следующий пример выполняет сравнение элементов строк BUFFER1 и BUFFER2 до первого их несовпадения (mismatch) :
cld ;сканируя в прямом направлении
mov cx, 100 ;100 байтов (CX используется в REPE),
lea si, buffer1 ;начиная с 1го элемента BUFFER1
lea di, buffer2 ;и с 1го элемента BUFFER2,
repe cmpsb ;сравниваем их.
jne mismatch ;признак ZF = 0, если сравниваемые
;строки не совпадают (mismatch)
match: ;если мы попали сюда, значит, они
;совпадают (match)
mismatch:
dec si ;если мы попали сюда, то мы нашли
dec di ;несовпадение, и возвращаем указатели
;SI и DI обратно, чтобы они указывали
;на первые несовпадающие байты.
После выхода из цикла REPE CMPSB флаг ZF будет сброшен, если несовпадение было найдено, и установлен в противоположном случае. Если несовпадение было найдено, то DI и SI будут указывать на байты, следующие непосредственно за байтами, которые не совпали; DEC DI и DEC SI уменьшают значения в этих регистрах таким образом, чтобы они указывали на сами несовпадающие байты.